#include <autocfg.h>
#include<type.h>
#include<hal.h>
#include<mem.h>

#ifdef CFG_MEM_BUDDY
	#include<buddy.h>
#endif

#ifdef CFG_MEM_SLATE
	#include<slate.h>
#endif

#ifdef CFG_MEM2
	#include<malloc.h>
#endif

/*================================
 *   memory system initialize
 *	内存管理系统初始化
 *================================*/
void acoral_mem_sys_init(){
	/*硬件相关的内存初始化，比如内存控制器等*/
  	HAL_MEM_INIT();
	/*堆初始化,这个可以选择不同管理系统，比如buddy内存管理等*/
  	acoral_mem_init((acoral_u32)HAL_HEAP_START,(acoral_u32)HAL_HEAP_END);
#ifdef CFG_MEM2
  	acoral_mem_init2();
#endif
}

void* acoral_malloc(acoral_u32 size)
{
	#ifdef CFG_MEM_BUDDY
	 return buddy_malloc(size);
	#endif

	#ifdef CFG_MEM_SLATE
	 return slate_malloc(size);
	#endif
	
	return NULL;
}

void acoral_free(void *ptr)
{
	#ifdef CFG_MEM_BUDDY
	buddy_free(ptr);
	#endif

	#ifdef CFG_MEM_SLATE
	slate_free(ptr);
	#endif
}

acoral_u32 acoral_malloc_size(acoral_u32 size)
{
	#ifdef CFG_MEM_BUDDY
	return buddy_malloc_size(size);
	#endif

	#ifdef CFG_MEM_SLATE
	return slate_malloc_size(size);
	#endif
	
	return 0;
}

acoral_err acoral_mem_init(acoral_u32 start_adr,acoral_u32 end_adr)
{
	#ifdef CFG_MEM_BUDDY
	return buddy_init(start_adr,end_adr);
	#endif

	#ifdef CFG_MEM_SLATE
	return slate_init(start_adr,end_adr);
	#endif
	
	return -1;
}

void acoral_mem_scan()
{
	#ifdef CFG_MEM_BUDDY
	buddy_scan();
	#endif

	#ifdef CFG_MEM_SLATE
	slate_scan();
	#endif
}


#ifdef CFG_MEM2
void acoral_mem_init2()
{
	v_mem_init();
}

void* acoral_malloc2(acoral_32 size)
{
   return v_malloc(size);
}

void acoral_free2(void * p)
{
	v_free(p);
}

void acoral_mem_scan2(void)
{
	v_mem_scan();
}
#endif //CFG_MEM2